package cn.demoncat.util.lang.constant;

/**
 * Mysql 常量
 *
 * @author 延晓磊
 * @since 2019年11月24日
 */
public final class MysqlConstant {

    /**
     * 函数：FUNCTION(字段, 参数...)
     */
    public static final class Function {

        /**
         * 日期格式化
         *
         * @param column, MysqlConstant.DateFormat
         */
        public static String DATE_FORMAT = "DATE_FORMAT(%s,%s)";

        /**
         * 拼接
         *
         * @param string,string
         */
        public static String CONCAT = "CONCAT(%s,%s)";

        /**
         * 拼接
         *
         * @param 分隔符,string,string
         */
        public static String CONCAT_WS = "CONCAT_WS(%s,%s,%s)";

        /**
         * 左边n个
         *
         * @param string,number
         */
        public static String LEFT = "LEFT(%s,%d)";

        /**
         * 右边n个
         *
         * @param string,number
         */
        public static String RIGHT = "RIGHT(%s,%d)";

        /**
         * 中间n个
         *
         * @param string,position(从1开始),length
         */
        public static String SUBSTR = "SUBSTR(%s,%d,%d)";

        /**
         * 默认值
         *
         * @param column,default
         */
        public static String IFNULL = "IFNULL(%s,%s)";

        /**
         * 三元表达式
         *
         * @param boolean表达式,结果1,结果2
         */
        public static String IF = "IF(%s,%s,%s)";

        /**
         * 字符长度
         *
         * @param column
         */
        public static String CHAR_LENGTH = "CHAR_LENGTH(%s)";

        /**
         * 替换
         *
         * @param str,fromStr,toStr
         */
        public static String REPLACE = "REPLACE(%s,%s,%s)";

        /**
         * 求绝对值
         *
         * @param column
         */
        public static String ABS = "ABS(%s)";

        /**
         * 四舍五入取整
         *
         * @param column
         */
        public static String ROUND = "ROUND(%s)";
        /**
         * 四舍五入
         *
         * @param column
         * @param 小数位
         */
        public static String ROUNDS = "ROUND(%s,%d)";
        /**
         * 截取小数
         *
         * @param column
         * @param 小数位，0表示取整
         */
        public static String TRUNCATE = "TRUNCATE(%s,%d)";
        /**
         * 向上取整
         *
         * @param column
         */
        public static String CELL = "CELL(%s)";
        /**
         * 向下取整
         *
         * @param column
         */
        public static String FLOOR = "FLOOR(%s)";
        /**
         * 求模
         *
         * @param column
         * @param 模
         */
        public static String MOD = "MOD(%s,%d)";
        /**
         * 求模
         *
         * @param column
         * @param column
         */
        public static String MODS = "MOD(%s,%s)";
    }

    /**
     * 分组函数：FUNCTION(字段)
     */
    public static final class GroupFunction {

        /**
         * 计数
         */
        public static String COUNT = "COUNT(1)";

        /**
         * 去重计数
         *
         * @param column
         */
        public static String COUNT_DISTINCT = "COUNT(DISTINCT %s)";

        /**
         * 条件计数
         *
         * 方案1：COUNT(type = 1 OR NULL)
         * 方案2：COUNT(IF(type = 1, 1, NULL))
         *
         * @param boolean表达式
         */
        public static String COUNT_CONDITION = "COUNT(IF(%s, 1, NULL))";

        /**
         * 求平均
         *
         * @param column
         */
        public static String AVG = "AVG(%s)";

        /**
         * 求和
         *
         * @param column
         */
        public static String SUM = "SUM(%s)";

        /**
         * 求和，为null（没有数据）时返回0
         *
         * @param column
         */
        public static String SUM_ZERO = "IFNULL(SUM(%s),0)";

        /**
         * 条件求和
         *
         * 方案1：SUM(IF(type = 1, amount, 0))
         *
         * @param boolean表达式,column
         */
        public static String SUM_CONDITION = "SUM(IF(%s, %s, 0))";

        /**
         * 求最大值
         *
         * @param column
         */
        public static String MAX = "MAX(%s)";

        /**
         * 求最小值
         *
         * @param column
         */
        public static String MIN = "MIN(%s)";

        /**
         * 合并值（多个用,分隔）
         *
         * 注意：GROUP_CONCAT默认长度超过1024时截取。
         * 查看：SHOW VARIABLES LIKE 'group_concat_max_len'
         * 设置：SET GLOBAL group_concat_max_len = 1024000
         *
         * @param column
         */
        public static String GROUP_CONCAT = "MIN(%s)";
    }

    /**
     * 日期函数：FUNCTION(字段)
     */
    public static final class DateFunction {

        /**
         * 季度：1-4
         *
         * @param column
         */
        public static final String QUARTER = "QUARTER(%s)";

        /**
         * 年-季度：yyyy-1
         *
         * @param column,column
         */
        public static final String YEAR_QUARTER = "CONCAT(YEAR(%s),'-',QUARTER(%s))";

        /**
         * 年：yyyy
         *
         * @param column
         */
        public static final String YEAR = "YEAR(%s)";

        /**
         * 月：1 - 12
         *
         * @param column
         */
        public static final String MONTH = "MONTH(%s)";

        /**
         * 日：1 - 31
         *
         * @param column
         */
        public static final String DAY = "DAYOFMONTH(%s)";

        /**
         * 时：0 - 23
         *
         * @param column
         */
        public static final String HOUR = "HOUR(%s)";

        /**
         * 分：0 - 59
         *
         * @param column
         */
        public static final String MINUTE = "MINUTE(%s)";

        /**
         * 秒：0 - 59
         *
         * @param column
         */
        public static final String SECOND = "SECOND(%s)";

        /**
         * 周：0 = 周一，6 = 周日
         *
         * @param column
         */
        public static final String WEEKDAY = "WEEKDAY(%s)";

        /**
         * 年中的周：0-53；周一开始，如果周一在去年时返回0，否则返回1
         *
         * @param column
         */
        public static final String WEEK = "WEEK(%s,1)";

        /**
         * 年-周：yyyy-1
         *
         * @param column,column
         */
        public static final String YEAR_WEEK = "CONCAT(YEAR(%s),'-',WEEK(%s,1))";

        /**
         * 年中的日：1 - 366
         *
         * @param column
         */
        public static final String DAY_OF_YEAR = "DAYOFYEAR(%s)";

        /**
         * 当前 yyyy-MM-dd
         */
        public static final String CURRENT_DATE = "CURRENT_DATE";
        /**
         * 当前 HH:mm:ss
         */
        public static final String CURRENT_TIME = "CURRENT_TIME";
        /**
         * 当前 yyyy-MM-dd HH:mm:ss
         */
        public static final String CURRENT = "CURRENT_TIMESTAMP";
        /**
         * 当前 yyyy-MM-dd HH:mm:ss
         */
        public static final String NOW = "NOW()";

        /**
         * 当前时间戳（秒）
         */
        public static final String CURR_TIMESTAMP_SEC = "UNIX_TIMESTAMP()";

        /**
         * 时间戳（秒）
         *
         * @param column
         */
        public static final String TIMESTAMP_SEC = "UNIX_TIMESTAMP(%s)";

        /**
         * 当前时间戳
         */
        public static final String CURR_TIMESTAMP = "UNIX_TIMESTAMP() * 1000";

        /**
         * 时间戳
         *
         * @param column
         */
        public static final String TIMESTAMP = "UNIX_TIMESTAMP(%s) * 1000";

        /**
         * 时间差(时间单位，小，大) = 时间单位
         *
         * 例：TIMESTAMPDIFF(DAY,create_time, end_time)
         */
        public static final String DIFF = "TIMESTAMPDIFF(%s,%s,%s)";
        /**
         * 日期差(大，小) = 天数
         *
         * 例：DATEDIFF(NOW(),create_time)，因为忽略时间，所以结果可能比DIFF大1
         */
        public static final String DIFF_DATE = "DATEDIFF(%s,%s)";

    }

    /**
     * 日期格式：DATE_FORMAT(日期, 格式)
     */
    public static final class DateFormat {
        /**
         * yyyy-MM-dd hh:mm:ss
         */
        public static final String DATE_TIME = "%Y-%m-%d %T";
        /**
         * yyyy-MM-dd hh
         */
        public static final String DATE_HOUR = "%Y-%m-%d %H";
        /**
         * yyyy-MM
         */
        public static final String DATE_MONTH = "%Y-%m";
        /**
         * yyyy-MM-dd
         */
        public static final String DATE = "%Y-%m-%d";
        /**
         * hh:mm:ss
         */
        public static final String TIME = "%T";
        /**
         * hh:mm
         */
        public static final String TIME_MINUTE = " %H:%i";

        /**
         * yyyy
         */
        public static final String YEAR = "%Y";
        /**
         * 01-12 月
         */
        public static final String FULL_MONTH = "%m";
        /**
         * 1-12 月
         */
        public static final String MONTH = "%c";
        /**
         * 01-31 日
         */
        public static final String FULL_DAY = "%d";
        /**
         * 1-31 日
         */
        public static final String DAY = "%e";
        /**
         * 0-6 周：0 = 周一，6 = 周日
         */
        public static final String WEEK = "%w";

        /**
         * 00-23 时
         */
        public static final String FULL_HOUR = "%H";
        /**
         * 0-23 时
         */
        public static final String HOUR = "%k";
        /**
         * 00-59 分
         */
        public static final String MINUTE = "%i";
        /**
         * 00-59 秒
         */
        public static final String SECOND = "%S";
    }




}